/*!
 * \file MapaRepresentaciones.h
 *
 * \date Jul 29, 2014
 * \author correa
 */
#ifndef MAPAREPRESENTACIONES_H_
#define MAPAREPRESENTACIONES_H_

#include <Grafo.h>

using namespace std;

class MatrixOfRepresentaciones;

class RowOfRepresentaciones : public vector<int> {
	friend class MatrixOfRepresentaciones;

	int _nelem;
	void fill(int r, const VertexSet& g);

public:
	RowOfRepresentaciones() : vector<int>(0), _nelem(0) {};
	~RowOfRepresentaciones() {};
    size_type size() const { return _nelem; }

};

class MatrixOfRepresentaciones : public vector<RowOfRepresentaciones> {
public:
	MatrixOfRepresentaciones(Grafo& g);
	~MatrixOfRepresentaciones() {};
};

class ArrayOfRepresentaciones;

class SubArrayOfRepresentaciones {
	friend class ArrayOfRepresentaciones;

	RowOfRepresentaciones *	_row;
	int 					_nhasta;
	int						_nelem;

public:
	SubArrayOfRepresentaciones() : _row(NULL), _nhasta(0), _nelem(0) {};
	~SubArrayOfRepresentaciones() {};
    int operator[](int v) const { return (*_row)[v] >= 0 ? _nhasta + (*_row)[v] : (*_row)[v]; }
    int size() const { return _nelem; }
};

class ArrayOfRepresentaciones : public vector<SubArrayOfRepresentaciones> {
public:
	ArrayOfRepresentaciones(MatrixOfRepresentaciones& matrix);
	virtual ~ArrayOfRepresentaciones() {};
//    const SubArrayOfRepresentaciones& operator[](int r) const { return vector<SubArrayOfRepresentaciones>::operator [](r); }
};

#endif /* MAPAREPRESENTACIONES_H_ */
